"""
    变量的访问原则--就近原则
    1.本地-->父级-->全局
"""

# 示例1 ****************************
x = 10

def func1():
    # 本地没有，调用时从调用地往上找
    print(x)

func1()#10

# 示例2 **************************

def outer():
    y = 15
    def inner():
        y=20
        print(y)
        
    # 调用inner
    inner()

outer()# 20

# 暂时性死区示例***************
# 报错:UnboundLocalError: cannot access local variable 'z' where it is not associated with a value
"""
def outer():
    y = 15
    def inner():
        
        print(y)
        y=20
        
    # 调用inner
    inner()

outer()# 20
"""

# 示例3 ****************
# 内部能访问外部变量，可以看到地址一样
def func3():
    z = 15
    print(id(z))
    def func4():
        print(id(z))

    func4()

func3()

# 对于不可变数据类型，根据谁定义谁维护的原则，内部不能直接修改外部变量
# UnboundLocalError: cannot access local variable 'z' where it is not associated with a value
"""
def func5():
    z = 15
    print(id(z))
    def func6():
        # 不允许直接操作
        z = z+5

    func6()

func5()
"""

"""
    对于可变数据类型就没有这个问题
    根本原因在于没有越级操作，因为可变数据类型的指向没变
"""
def func7():
    z = [1,2,3]
    def func8():
        
        z[1] =z[1]+ 12
        print(z)

    func8()

func7()

"""
    用委托来处理不可变数据类型
"""
def func9():
    t = 15
    def func10(t):
        t= t+5
        print(t)
    func10(t)
func9()